/*
 * fileio.c
 */
#include <system.h>
#include <v93.h>
#include <pio.h>
#include "libm.h"
#include "vardecl.h"

#ifndef LOCAL
#define LOCAL
#endif

#define TEXTURE_SIZE (131072L)
#define BG_SIZE (262144L)

/*
========================================
  数値を10進数文字列に変換する
======================================== 
*/
char *
ultod(unsigned long val)
{
  static char dectbl[] = "0123456789";
  static char buf[12];
  int i;

  buf[10] = '\0';
  for (i = 9; i >= 0; i--) {
    buf[i] = dectbl[val % 10];
    val /= 10;
  }
  return buf;
}

/*
========================================
  数値を16進数文字列に変換する
======================================== 
*/
char *
ultoh(unsigned long val)
{
  static char hextbl[] = "0123456789ABCDEF";
  static char buf[10];
  int i;

  buf[8] = '\0';
  for (i = 7; i >= 0; i--) {
    buf[i] = hextbl[val % 16];
    val /= 16;
  }
  return buf;
}

/* 
----------------------------------------
  ファイルオープンエラー
----------------------------------------
*/
LOCAL volatile void
openerr(char *fname)
{
  pio_putstr("Fail ");
  pio_putstr(fname);
  pio_putstr(" open.\n");
  _exit();
}

/* 
----------------------------------------
  ファイルリードエラー
----------------------------------------
*/
LOCAL volatile void
readerr(char *fname)
{
  pio_putstr("Fail ");
  pio_putstr(fname);
  pio_putstr(" read.\n");
  _exit();
}

/* 
----------------------------------------
  ファイルシークエラー
----------------------------------------
*/
LOCAL volatile void
seekerr(char *fname)
{
  pio_putstr("Fail ");
  pio_putstr(fname);
  pio_putstr(" seek.\n");
  _exit();
}

/*
========================================
  フォントテクスチャデータをフォントバッファに
  読み込む
========================================
*/
void
ReadFont(char *fname)
{
  int fh;
  long pos;

  pio_putstr("Font file loading ...\n");
  if ((fh = pio_fopen(fname, "rb")) < 0) {
    /* 
     * OPEN FAIL
     */
    openerr(fname);
  }
  /* ファイルの終わりまでいく */
  if ((pos = pio_fseek(fh, 0L, PIO_SEEK_END)) < 0) {
    /* 
     * SEEK FAIL
     */
    seekerr(fname);
  }
  /* テクスチャデータファイルのヘッダを読み飛ばす */
  if (pio_fseek(fh, pos - TEXTURE_SIZE, PIO_SEEK_SET) != pos - TEXTURE_SIZE) {
    /* 
     * SEEK FAIL
     */
    seekerr(fname);
  }
  /* 一時バッファに読み込む */
  if (pio_fread(fh, TEXTURE_SIZE, fontbuf) < TEXTURE_SIZE) {
    /* 
     * READ FAIL
     */
    readerr(fname);
  }
  /* ファイルのクローズ */
  pio_fclose(fh);
  SetTexture(fontbuf, TBANK_FONT);
}

/* 
========================================
  テクスチャデータをバッファに読み込んで
  所定のメモリに転送する

  引数
  short packed;		PACKED TEXTURE なら TRUE
  char *fname;		ファイル名
  int bank;		転送するバンク番号
========================================
*/
void
ReadTexture(int packed, char *fname, int bank)
{
  int fh;
  long pos;

  pio_putstr("Texture file '");
  pio_putstr(fname);
  pio_putstr("' loading ...\n");
  /* 地面のテクスチャ */
  if ((fh = pio_fopen(fname, "rb")) < 0) {
    /* 
     * FAIL OPEN
     */
    openerr(fname);
  }
  /* ファイルの終わりまでいく */
  if ((pos = pio_fseek(fh, 0L, PIO_SEEK_END)) < 0) {
    /* 
     * FAIL SEEK
     */
    seekerr(fname);
  }
  /* テクスチャデータファイルのヘッダを読み飛ばす */
  if (pio_fseek(fh, pos - TEXTURE_SIZE, PIO_SEEK_SET) != pos - TEXTURE_SIZE) {
    /* 
     * FAIL SEEK
     */
    seekerr(fname);
  }
  /* 一時バッファに読み込む */
  if (pio_fread(fh, TEXTURE_SIZE, filereadbuf) < TEXTURE_SIZE) {
    /* 
     * FAIL READ
     */
    readerr(fname);
  }
  /* ファイルのクローズ */
  pio_fclose(fh);

  if (!packed)
    SetTexture(filereadbuf, bank);
  else
    SetPackedTexture(filereadbuf, bank);
}

/* 
========================================
  バックグラウンドの絵を読み込む
========================================
*/
void
ReadBG(char *fname)
{
  int fh;

  pio_putstr("BG data loading ...\n");
  if ((fh = pio_fopen(fname, "rb")) < 0) {
    /* 
     * FAIL OPEN
     */
    openerr(fname);
  }
  /* 一時バッファに読み込む */
  if (pio_fread(fh, BG_SIZE, filereadbuf) < BG_SIZE) {
    /* 
     * FAIL READ
     */
    readerr(fname);
  }
  /* ファイルのクローズ */
  pio_fclose(fh);
  
  KINGDispOff();
  irq_disable();
  KINGTrans(KING_BG0, filereadbuf, 2);
  irq_enable();
}
